最近在学Lua,关于Lua编译的地方,由于Lua是用C语言写的,在C++中使用C语言的函数,需要使用extern "C“编译才能过,之前貌似没有接触过这方面的知识,写个blog纪念一下,顺便整理一下extern关键字的作用。
一.extern "C"的作用
这是我第一次见,因为之前一直没有过C++去调用
C的函数。关于C++和C语言混合编程其实还有一些地方要注意的。比如,如果编译时出现下面的错误:
error:预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)
这是因为C语言和C++的预编译头不同,如果C语言文件较少,可以将C语言文件的属性->预编译头改为不使用预编译头,就可以解决问题啦。
而如果这时候直接在cpp文件中使用C语言的函数,则会出现下面的错误:
>C++Test.obj : error LNK2019: 无法解析的外部符号 "int __cdecl CTest(int,int)" (?CTest@@YAHHH@Z),该符号在函数 _wmain 中被引用。
错误发生在link阶段,连接器没有找到int_cdecl CTest(int int)这个函数,而我们明明写了CTest这个函数。原因是C++和C的编译方式不同,C++支持函数重载,所以在编译的时候,函数名称后面通常会加上一大堆奇葩的东东,一般是记录重载的信息的,具体被编译成什么样需要看编译器的脾气。而C语言不支持